#include <iostream>
#include <sstream>
#include <string>

#include "ListaCliente.h"


using namespace std;

/*--------------Constructores y destructores-----*/
ListaCliente::ListaCliente()
{
    primero = actual = NULL;
}
ListaCliente::~ListaCliente()
{
    actual = primero;
    while(primero){
         actual= primero;
	   primero=primero->getSigNodo();
         delete actual; 		    }
    actual=NULL;
    primero=NULL;

}
/*-----------------------------------------------*/

/*--------------Metodos set y get---------------*/
void ListaCliente::setPrimero(NodoCliente* prim)
{
    primero = prim;
}
NodoCliente* ListaCliente::getPrimero()
{
    return primero;
}
void ListaCliente::setActual(NodoCliente *actu)
{
    actual = actu;
}
NodoCliente* ListaCliente::getActual()
{
    return actual;
}


/*-----------------------------------*/


/*------------Metodos importantes----*/
void ListaCliente::insertarPrimero(Cliente *c)
{
    if(primero == NULL)
    {
        primero = new NodoCliente(c,NULL);
    }
    else
    {
        actual = new NodoCliente(c,primero);
        primero = actual;

    }
}
void ListaCliente::borrarPrimero()
{
    if(primero != NULL && primero->getSigNodo() != NULL)
    {
        actual = primero->getSigNodo();
        delete primero;
        primero = actual;
    }
    else
    {
        if(primero->getSigNodo() == NULL)
        {
            delete primero;
            primero = NULL;
        }
    }
}

void ListaCliente::mostrar()
{

    actual = primero;
        while(actual != NULL)
        {
            cout<<"-----------------------------\n";
            actual->getCliente()->mostrarCliente();
            actual = actual->getSigNodo();
        }

}

void ListaCliente::insertarFinal(Cliente *c)
{
    if(primero == NULL)
    {
        primero = new NodoCliente(c,NULL);
    }
    else
    {
        if(primero->getSigNodo() == NULL)
        {
            primero->setSigNodo(new NodoCliente(c, NULL));
        }
        else
        {
            actual = primero->getSigNodo();
            while(actual->getSigNodo() != NULL)
            {
                actual = actual->getSigNodo();
            }
            actual->setSigNodo(new NodoCliente(c,NULL));
        }
    }

}

void ListaCliente::borrarFinal()
{
    actual = primero;
    while(actual->getSigNodo()->getSigNodo() != NULL)
    {
        actual = actual->getSigNodo();
    }
    delete actual->getSigNodo();
    actual->setSigNodo(NULL);

}

Cliente* ListaCliente::buscarPorNombre(string nom)
{
    if(primero == NULL)
    {
        cout<<"La lista esta vacia\n";
        return NULL;
    }
    else
    {
        if(primero->getCliente()->getNombre() == nom)
            return primero->getCliente();

        if(primero->getSigNodo() != NULL)
        {
            actual = primero->getSigNodo();
            while(actual!= NULL)
            {
                if(actual->getCliente()->getNombre() == nom)
                {
                    return actual->getCliente();
                }
                actual = actual->getSigNodo();
            }
        }

    }

}

void ListaCliente::borrarPorNombre(string nom)
{
    actual = primero;
    if(primero != NULL && primero->getSigNodo() != NULL)
    {
        while(actual->getSigNodo() != NULL )
        {
            if(actual->getSigNodo()->getCliente()->getNombre() == nom)
            {
                NodoCliente* aux = actual->getSigNodo();
                actual->setSigNodo(aux->getSigNodo());
                delete aux;
            }
            actual = actual->getSigNodo();
        }

    }
    else{
        if(actual->getSigNodo()->getCliente()->getNombre() == nom)
        {
            delete actual->getSigNodo();
            actual->setSigNodo(NULL);
        }
    }
}
